# 打印某年某月的日历
def print_month(year, month):
    # 每月的天数，考虑到闰年 2 月
    days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        days_in_month[1] = 29  # 闰年2月

    # 月的天数
    days = days_in_month[month - 1]
    
    # 使用 Zeller 公式来计算某月第一天是星期几
    # Zeller公式对于1月和2月会将其看作上一年的13月和14月来计算
    # 我们修改年份和月份以避免在最后的输出中影响到显示的年份
    temp_year = year
    temp_month = month
    if temp_month < 3:
        temp_month += 12
        temp_year -= 1
    
    K = temp_year % 100
    J = temp_year // 100
    f = 1 + ((13 * (temp_month + 1)) // 5) + K + (K // 4) + (J // 4) - (2 * J)
    weekday = f % 7
    
    # Zeller公式返回的星期六为0，星期日为1，因此调整为星期日为0，星期六为6
    weekday = (weekday + 5) % 7  # 使得Zeller公式返回的星期天为0，星期六为6

    # 打印标题，确保输出的月份和年份是正确的
    print(f"    {year}年 {month}月")
    print("日 一 二 三 四 五 六")
    
    # 打印空格，直到第一天
    for _ in range(weekday):
        print("   ", end="")

    # 打印天数
    day = 1
    for i in range(weekday, 7):
        print(f"{day:2d} ", end="")
        day += 1

    print()
    
    # 打印剩下的天
    while day <= days:
        for i in range(7):
            if day <= days:
                print(f"{day:2d} ", end="")
                day += 1
        print()

# 打印2021年每个月的日历
def print_year_calendar(year):
    for month in range(1, 13):
        print_month(year, month)
        print("\n")

# 调用打印2021年日历的函数
print_year_calendar(2021)
